
import math



# 1 默认切片大小是256 
# 2 使用的是google坐标系

# 经纬度转瓦片坐标  经度 纬度
def LatLongToTileXY(longitude, latitude, zoom, tileSize = 256): 
    # 地球的周长的一半 20037508.342789244 单位米
    circumferenceHalf = math.pi* 6378137
    mx = (longitude * circumferenceHalf) / 180
    temp = math.log(math.tan((90 + latitude) * (math.pi / 360.0))) / (math.pi / 180.0)
    my = (circumferenceHalf * temp) / 180
    # 米/每像素
    resolution = (math.pi * 2 * 6378137) / (tileSize * math.pow(2, zoom))
  
    # px = (mx + circumferenceHalf) / resolution
    px = ((longitude + 180) / 360) * math.pow(2, zoom) * tileSize
    # py = (my + circumferenceHalf) / resolution
    py = ((circumferenceHalf * temp) / 180 + circumferenceHalf) / (math.pi * 2 * 6378137) / (tileSize * math.pow(2, zoom))
  
    # tx = Math.floor(px / tileSize)
    tx = math.floor(((longitude + 180) / 360) * math.pow(2, zoom))
    ty = (1 - math.asinh(math.tan(latitude * math.pi / 180)) / math.pi) * math.pow(2, zoom)
    # 双曲正弦函数 arsinh(x) => ln(x + (x^2 + 1)^0.5)
    ty = math.floor(
    ((1 -
      math.log(
        math.tan((latitude * math.pi) / 180) +
          1 / math.cos((latitude * math.pi) / 180)
      ) /
        math.pi) /
      2) * math.pow(2, zoom))

    return tx, ty


# 瓦片坐标转经纬度
def TileXYToLatLong(tx, ty, zoom):
    longitude = (tx / math.pow(2, zoom)) * 360 - 180
    tmp = math.PI - (2 * math.PI * ty) / math.pow(2, zoom)
    # latitude = (180 / Math.PI) * Math.atan(sinh(tmp))
    # 双曲函数sinh(x)=(e^x - e^(-x)) * 0.5
    latitude =  (180 / math.PI) * math.atan(0.5 * (math.exp(tmp) - math.exp(-tmp)))
    return longitude, latitude

def DegreesMinutesSeconds2Decimal(d, m, s):
    return d + m / 60. + s / 3600.

# 找一个区域附近 几个点块
def find_rectangle_area(mid_x, mid_y, lr, ud):
    # 定位左上
    left = mid_x - lr
    up = mid_y - ud
    ret = []
    for i in range(0, lr * 2):
        lc = []
        for j in range(0, ud * 2):
            lc.append([left + i, up + j])
        ret.append(lc)
    return ret









